package ec.edu.ucacue.siop.proceso.iniciar.datosCalidad;

import java.util.List;

import org.hibernate.Session;

import ec.edu.ucacue.siop.dao.material.PropiedadDAO;
import ec.edu.ucacue.siop.dao.material.PropiedadDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.UnidadFuncionalDAO;
import ec.edu.ucacue.siop.dao.recurso.UnidadFuncionalDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.VariableCalidadDAO;
import ec.edu.ucacue.siop.dao.recurso.VariableCalidadDAOImpl;
import ec.edu.ucacue.siop.modelo.material.Propiedad;
import ec.edu.ucacue.siop.modelo.recurso.MaterialDefProd;
import ec.edu.ucacue.siop.modelo.recurso.MaterialDefUso;
import ec.edu.ucacue.siop.modelo.recurso.UnidadFuncional;
import ec.edu.ucacue.siop.modelo.recurso.VariableCalidad;
import ec.edu.ucacue.siop.proceso.iniciar.lectores.LectorVarCalidadUnidad;
import ec.edu.ucacue.siop.utilidades.HibernateUtil;



public class CargarVariablesCalidad {
	private String error;
	
	public String getError() {
		return error;
	}
	public void setError(String error) {
		this.error = error;
	}

	public boolean cargar(String archivo) {
		LectorVarCalidadUnidad lector = new LectorVarCalidadUnidad();
		
		if(lector.leer(archivo)) {
			
			List<ec.edu.ucacue.siop.proceso.iniciar.lectores.ContRelacionCalidadUnidadMateria> lista = lector.getLineaExcel();
			Session ses = HibernateUtil.beginTransaction();
			UnidadFuncionalDAO ufDao = new UnidadFuncionalDAOImpl();
			PropiedadDAO propDao = new PropiedadDAOImpl();
			VariableCalidadDAO varCalDao = new VariableCalidadDAOImpl();
			
			List<UnidadFuncional> listaUf = ufDao.findAll(UnidadFuncional.class);
			List<Propiedad> listaProp = propDao.findAll(Propiedad.class);
			for(int i = 0; i<lista.size(); i++){
				if(!lista.get(i).getMateria1().contentEquals("Variable de proceso")) {
					if(lista.get(i).getSistema() != null) {
						UnidadFuncional uf = buscar(lista.get(i).getSistema(), listaUf);
						Propiedad prop = buscarProp(lista.get(i).getPropiedad(),listaProp);
						MaterialDefProd producto = null;
						MaterialDefUso insumo = null;
						if(lista.get(i).isProducto()) {
							producto = buscarEnProducto(uf.getListaProductosSalida(),lista.get(i).getMateria1());
						}
						else{
							insumo = buscarEnInsumo(uf.getListaProductosEntrada(),lista.get(i).getMateria1());
						}
						VariableCalidad varCal = varCalDao.create(lista.get(i).getPropiedad(), null, 
								uf, producto, insumo, prop, null);
						System.out.println("uf" + uf.getNombre() + " prop " + prop.getNombre());
					}
					else {
						UnidadFuncional uf = buscar(lista.get(i).getUnidad(), listaUf);
						Propiedad prop = buscarProp(lista.get(i).getPropiedad(),listaProp);
						MaterialDefProd producto = null;
						MaterialDefUso insumo = null;
						if(lista.get(i).isProducto()) {
							producto = buscarEnProducto(uf.getListaProductosSalida(),lista.get(i).getMateria1());
						}
						else{
							insumo = buscarEnInsumo(uf.getListaProductosEntrada(),lista.get(i).getMateria1());
						}
						VariableCalidad varCal = varCalDao.create(lista.get(i).getPropiedad(), null, 
								uf, producto, insumo, prop, null);
						System.out.println("uf" + uf.getNombre() + " prop " + prop.getNombre());
					}
				}
				
			}
			for(int i=0; i<listaUf.size(); i++){
				ses.save(listaUf.get(i));
			}
			HibernateUtil.commitTransaction();
			HibernateUtil.closeSession();
		}
		else {
			String errorLectura = lector.getError();
			System.out.println("Error = " + errorLectura);
			return false;
		}
		
		return true;
	}
	private MaterialDefUso buscarEnInsumo(
			List<MaterialDefUso> listaProductosEntrada, String materia1) {
		MaterialDefUso res = null;
		boolean encontrado = false;
		for (int i=0; i<listaProductosEntrada.size() && !encontrado; i++){
			if(listaProductosEntrada.get(i).getMaterial().getNombre().contentEquals(materia1)) {
				encontrado = true;
				res = listaProductosEntrada.get(i);
			}
		}
		return res;
	}
	private MaterialDefProd buscarEnProducto(
			List<MaterialDefProd> listaProductosSalida, String materia1) {
		MaterialDefProd res = null;
		boolean encontrado = false;
		for (int i=0; i<listaProductosSalida.size() && !encontrado; i++){
			if(listaProductosSalida.get(i).getMaterialObtenido().getNombre().contentEquals(materia1)) {
				encontrado = true;
				res = listaProductosSalida.get(i);
				
			}
		}
		return res;
	}
	private Propiedad buscarProp(String propiedad, List<Propiedad> listaProp) {
		Propiedad prop = null;
		boolean encontrado = false;
		for(int i=0; i<listaProp.size() && !encontrado; i++) {
			if(listaProp.get(i).getNombre().contentEquals(propiedad)) {
				prop = listaProp.get(i);
				encontrado = true;
			}
		}
		return prop;
	}
	private UnidadFuncional buscar(String sistema, List<UnidadFuncional> listaUf) {
		UnidadFuncional uf = null;
		boolean encontrado = false;
		for(int i=0; i<listaUf.size() && !encontrado; i++) {
			if(listaUf.get(i).getNombre().contentEquals(sistema)) {
				uf = listaUf.get(i);
				encontrado = true;
			}
		}
		return uf;
	}

}
